/*
 * @Description: 抽象类
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-04-30 18:58:45
 * @LastEditTime: 2021-05-06 09:37:47
 */

/**
 * 抽象类是使用`abstract`关键字定义的类
 * 抽象类是为派生类（子类）服务的
 * 抽象方法只能出现在抽象类中
 * 抽象方法必须在子类中实现，否则编译错误
 * 属性也可以抽象，但一般不这么写
 * 抽象类中的抽象方法只有申明没有实现
 * 抽象类中的实例方法会被继承到子类中
 * 抽象类是不能够被实例化的，只有其子类可以实例化
 * `abstract`不能修饰构造方法
 */
(function () {
    // class Animal{
    //     abstract name:string //报错：抽象方法只能出现在抽象类中
    // }

    abstract class Animal {
        // abstract name:string //抽象属性，一般不这么干
        // abstract run() {    //报错：方法“run”不能具有实现，因为它标记为抽象。
        //     //...
        // }

        name: string

        constructor(name: string) {
            this.name = name
        }

        // 抽象方法
        abstract run(): void

        sayHi() {
            console.log("hello");
        }
    }

    class Dog extends Animal {
        run() {
            console.log(`${this.name}在自由的奔跑`);
        }
    }

    // let animal = new Animal() //报错：无法创建抽象类的实例
    let dog = new Dog("小狗花花")
    dog.run()   // 小狗花花在自由的奔跑
    dog.sayHi() // hello
})()
